home *** CD-ROM | disk | FTP | other *** search
/ World of Amiga / World of Amiga.iso / archive / assembly / juliasrc.lha / julia.s < prev    next >
Text File  |  1993-02-28  |  9KB  |  403 lines

  1. **********************************************************************
  2.         incdir    "sys:include/"
  3.         include    "exec/exec_lib.i"
  4.         include    "hardware/custom.i"
  5. **********************************************************************
  6. CALL        MACRO
  7.         jsr    _LVO\1(a6)
  8.         ENDM
  9. **********************************************************************
  10.         rsset    -4
  11. PixelMask    rs.w    1    ; mask to OR with bitplanes
  12. WordsInRaster    rs.w    1    ; number of words left in current raster
  13. InitialX    rs.w    1    ; inital x
  14. InitialY    rs.w    1    ; inital y
  15. LinesLeft    rs.w    1    ; number of lines left to draw
  16. **********************************************************************
  17. BootBlock:    dc.b    "DOS",0
  18.         dc.l    "CKSM"
  19.         dc.l    $370
  20.  
  21.         movem.l    d1-d7/a0-a6,-(a7)
  22.         CALL    Forbid
  23.         CALL    Disable
  24.         lea    $dff000,a4
  25.         bsr.w    WaitVBlank
  26.         lea    $7c800,a5
  27.         move.l    a5,cop2lc(a4)
  28.         clr.w    copjmp2(a4)
  29.         move.w    #$07e0,dmacon(a4)
  30.         move.w    #$8240,dmacon(a4)
  31.  
  32.         lea    Copper(pc),a6
  33.         moveq    #((Palette-Copper)/4)-1,d7
  34. L2        move.l    (a6)+,(a5)+
  35.         dbf    d7,L2
  36.  
  37.         move.w    #$0180,d0        ; color 0
  38.         moveq    #31,d7
  39. L3        move.w    d0,(a5)+
  40.         move.w    (a6)+,(a5)+
  41.         addq.w    #2,d0
  42.         dbf    d7,L3
  43.  
  44.         move.w    #$00e0,d0        ; init bitplane pointers
  45.         moveq    #0,d1
  46.         moveq    #8,d7
  47. L4        move.w    d0,(a5)+
  48.         addq.w    #2,d0
  49.         move.w    #$0007,(a5)+
  50.         move.w    d0,(a5)+
  51.         addq.w    #2,d0
  52.         move.w    d1,(a5)+
  53.         addi.w    #256*40,d1
  54.         subq.l    #2,d7
  55.         bpl.b    L4
  56.  
  57.         move.l    d7,(a5)+        ; $fffffffe
  58.  
  59.         move.l    #$30d8a600,(a5)+    ; control words
  60. MakeSprite    move.w    (a6)+,d7        ; get height/gap pair
  61.         bmi.b    DoneSprite
  62.         move.w    d7,d6
  63.         lsr.w    #8,d7            ; extract height part
  64. .heightloop    move.w    (a6)+,(a5)+        ; sprite data
  65.         clr.w    (a5)+            ; clear plane 2
  66.         dbf    d7,.heightloop
  67.         andi.w    #$00ff,d6        ; extract gap part
  68. .gaploop    clr.l    (a5)+            ; blank
  69.         dbf    d6,.gaploop
  70.         bra.b    MakeSprite
  71.  
  72. DoneSprite:    move.l    #$80000014,(a5)+    ; mask & word per raster count
  73.  
  74. StartJulia:    lea    $70000,a0
  75. .1        btst.b    #6,dmaconr(a4)
  76.         bne.b    .1
  77.         move.l    a0,bltdpt(a4)
  78.         move.l    #$01000000,bltcon0(a4)
  79.         clr.w    bltdmod(a4)
  80.         move.w    #(640*64)+40,bltsize(a4)
  81.  
  82. FindJulia:    move.l    (a6)+,(a5)
  83.         bne.b    GotJulia
  84.         lea    JuliaData(pc),a6
  85.         bra.b    FindJulia
  86.  
  87. GotJulia:    lea    Plot00+2(pc),a1
  88.         move.w    (a5),(RasterInit-Plot00)(a1)    ; initial m
  89.         move.w    (a6),(a1)            ; pixel step
  90.         move.w    (a6)+,(RasterAdd-Plot00)(a1)    ; raster step
  91.         move.w    (a6)+,(Initial_C1-Plot00)(a1)    ; initial c1
  92.         move.w    (a6)+,(Initial_C2-Plot00)(a1)    ; initial c2
  93.         move.l    a6,((BootBlock+4)-(Plot00+2))(a1) ; save julia pointer
  94.         move.w    #256,LinesLeft(a5)        ; vertical height
  95.         move.w    #256*40,d2
  96.         lea    (a0,d2.w),a1
  97.         lea    (a1,d2.w),a2
  98.         lea    (a2,d2.w),a3
  99.         lea    $04000000,a6        ; for magnitude test
  100.  
  101. .1        btst.b    #6,dmaconr(a4)
  102.         bne.b    .1
  103.  
  104.         bsr.w    WaitVBlank
  105.         move.w    #$83a0,dmacon(a4)
  106.         lea    (a3,d2.w),a4
  107.  
  108. PixelLoop:    move.w    InitialX(a5),d1        ; inital x
  109.         move.w    InitialY(a5),d0        ; inital y
  110.         moveq    #30,d7
  111. Initial_C1:    move.w    #$0000,d4        ; initial c1
  112. Initial_C2:    move.w    #$0000,d5        ; initial c2
  113.         move.w    d0,d2
  114.         move.w    d1,d3
  115.         bra.b    CheckMagnitude
  116.  
  117. IterateJulia:    sub.l    d3,d2        ; x^2 - y^2
  118.         lsl.l    #4,d2        ; fix decimal point
  119.         swap    d2        ; ...
  120.         add.w    d4,d2        ; x1 = x^2 - y^2 + c1
  121.  
  122.         move.w    d1,d3        ; y
  123.         muls    d0,d3        ; x * y
  124.         lsl.l    #5,d3        ; fix decimal point and multiply by 2
  125.         swap    d3        ; ...
  126.         add.w    d5,d3        ; y1 = 2 * x * y + c2
  127.  
  128.         move.w    d2,d0        ; x = x1
  129.         move.w    d3,d1        ; y = y1
  130.  
  131. CheckMagnitude:    muls    d2,d2        ; x^2
  132.         muls    d3,d3        ; y^2
  133.         move.l    d2,d6
  134.         add.l    d3,d6        ; z = x^2 + y^2
  135.         cmp.l    a6,d6        ; escaped yet?
  136.         dbhi    d7,IterateJulia
  137.         move.w    PixelMask(a5),d6
  138.         moveq    #0,d5
  139.         move.b    JumpTable+1(pc,d7.w),d5
  140.         jmp    JumpTable(pc,d5.w)
  141.  
  142. JumpTable:    dc.b    Plot00-JumpTable,Plot31-JumpTable
  143.         dc.b    Plot30-JumpTable,Plot29-JumpTable
  144.         dc.b    Plot28-JumpTable,Plot27-JumpTable
  145.         dc.b    Plot26-JumpTable,Plot25-JumpTable
  146.         dc.b    Plot24-JumpTable,Plot23-JumpTable
  147.         dc.b    Plot22-JumpTable,Plot21-JumpTable
  148.         dc.b    Plot20-JumpTable,Plot19-JumpTable
  149.         dc.b    Plot18-JumpTable,Plot01-JumpTable
  150.         dc.b    Plot16-JumpTable,Plot15-JumpTable
  151.         dc.b    Plot14-JumpTable,Plot13-JumpTable
  152.         dc.b    Plot12-JumpTable,Plot11-JumpTable
  153.         dc.b    Plot10-JumpTable,Plot09-JumpTable
  154.         dc.b    Plot08-JumpTable,Plot07-JumpTable
  155.         dc.b    Plot06-JumpTable,Plot05-JumpTable
  156.         dc.b    Plot04-JumpTable,Plot03-JumpTable
  157.         dc.b    Plot02-JumpTable,Plot17-JumpTable
  158.  
  159. Plot22:        or.w    d6,(a4)
  160.         or.w    d6,(a2)
  161.         or.w    d6,(a1)
  162.         bra.b    Plot00
  163.  
  164. Plot21:        or.w    d6,(a4)
  165.         or.w    d6,(a2)
  166.         or.w    d6,(a0)
  167.         bra.b    Plot00
  168.  
  169. Plot20:        or.w    d6,(a4)
  170.         or.w    d6,(a2)
  171.         bra.b    Plot00
  172.  
  173. Plot18:        or.w    d6,(a4)
  174.         or.w    d6,(a1)
  175.         bra.b    Plot00
  176.  
  177. Plot26:        or.w    d6,(a4)
  178. Plot10:        or.w    d6,(a3)
  179.         or.w    d6,(a1)
  180.         bra.b    Plot00
  181.  
  182. Plot23:        or.w    d6,(a4)
  183.         or.w    d6,(a2)
  184.         or.w    d6,(a1)
  185.         or.w    d6,(a0)
  186.         bra.b    Plot00
  187.  
  188. Plot19:        or.w    d6,(a4)
  189.         or.w    d6,(a1)
  190.         or.w    d6,(a0)
  191.         bra.b    Plot00
  192.  
  193. Plot27:        or.w    d6,(a4)
  194. Plot11:        or.w    d6,(a3)
  195.         or.w    d6,(a1)
  196.         or.w    d6,(a0)
  197.         bra.b    Plot00
  198.  
  199. Plot17:        or.w    d6,(a4)
  200.         or.w    d6,(a0)
  201.         bra.b    Plot00
  202.  
  203. Plot25:        or.w    d6,(a4)
  204. Plot09:        or.w    d6,(a3)
  205.         or.w    d6,(a0)
  206.         bra.b    Plot00
  207.  
  208. Plot29:        or.w    d6,(a4)
  209. Plot13:        or.w    d6,(a3)
  210. Plot05:        or.w    d6,(a2)
  211.         or.w    d6,(a0)
  212.         bra.b    Plot00
  213.  
  214. Plot16:        or.w    d6,(a4)
  215.         bra.b    Plot00
  216.  
  217. Plot24:        or.w    d6,(a4)
  218. Plot08:        or.w    d6,(a3)
  219.         bra.b    Plot00
  220.  
  221. Plot28:        or.w    d6,(a4)
  222. Plot12:        or.w    d6,(a3)
  223. Plot04:        or.w    d6,(a2)
  224.         bra.b    Plot00
  225.  
  226. Plot30:        or.w    d6,(a4)
  227. Plot14:        or.w    d6,(a3)
  228. Plot06:        or.w    d6,(a2)
  229. Plot02:        or.w    d6,(a1)
  230.         bra.b    Plot00
  231.  
  232. Plot31:        or.w    d6,(a4)
  233. Plot15:        or.w    d6,(a3)
  234. Plot07:        or.w    d6,(a2)
  235. Plot03:        or.w    d6,(a1)
  236. Plot01:        or.w    d6,(a0)
  237. Plot00:        addi.w    #$0000,(a5)        ; pixel "step"
  238.         ror.w    PixelMask(a5)        ; shift mask over
  239.         bpl.w    PixelLoop
  240.  
  241.         addq.w    #2,a0
  242.         addq.w    #2,a1
  243.         addq.w    #2,a2
  244.         addq.w    #2,a3
  245.         addq.w    #2,a4
  246.         subq.w    #1,WordsInRaster(a5)    ; subtract from word counter
  247.         bne.w    PixelLoop
  248.  
  249.         btst.b    #6,$bfe001
  250.         beq.b    Exit
  251.  
  252.         move.w    #320/16,WordsInRaster(a5)    ; words per raster
  253.         btst.b    #2,$dff016        ; new julia?
  254.         beq.b    NewJulia
  255.  
  256. RasterInit:    move.w    #$0000,(a5)        ; inital raster value
  257. RasterAdd:    addi.w    #$0000,InitialY(a5)        ; raster "step"
  258.         subq.w    #1,LinesLeft(a5)
  259.         bne.w    PixelLoop
  260.  
  261. WaitMouse:    btst.b    #6,$bfe001
  262.         beq.b    Exit
  263.         btst.b    #2,$dff016
  264.         bne.b    WaitMouse
  265.  
  266. NewJulia:    movea.l    BootBlock+4(pc),a6
  267.         lea    $dff000,a4
  268. .waitRMBup    btst.b    #2,$0016(a4)
  269.         beq.b    .waitRMBup
  270.         bra.w    StartJulia
  271.  
  272. Exit:        lea    $dff000,a4
  273.         bsr.b    WaitVBlank
  274.         clr.w    $0100(a4)
  275.         movem.l    (a7)+,d1-d7/a0-a6
  276.         CALL    Enable
  277.         CALL    Permit
  278.         lea    DosName(pc),a1
  279.         CALL    FindResident
  280.         movea.l    d0,a0
  281.         movea.l    $16(a0),a0
  282.         moveq    #0,d0
  283.         rts    
  284.  
  285. WaitVBlank:    btst.b    #0,5(a4)
  286.         bne.b    WaitVBlank
  287. .1        btst.b    #0,5(a4)
  288.         beq.b    .1
  289.         rts    
  290.  
  291. Copper:        dc.l    $01005200,$01020000,$01080000
  292.         dc.l    $008e2981,$009029c1
  293.         dc.l    $00920038,$009400d0
  294.         dc.l    $01200007,$0122c8d0
  295.  
  296. Palette:    dc.w    $0000,$0831,$000e,$000d,$000c,$000b,$000a,$0009
  297.         dc.w    $0008,$0007,$0106,$0205,$0304,$0403,$0502,$0611
  298.         dc.w    $0720,$0fff,$0942,$0a53,$0b64,$0c75,$0d86,$0c97
  299.         dc.w    $0ba8,$0a9a,$098b,$0879,$0767,$0555,$0343,$0131
  300.  
  301. SpriteData:    dc.b    13,9
  302.         dc.w    %0000001100000000
  303.         dc.w    %0000001100000000
  304.         dc.w    %0000011110000000
  305.         dc.w    %0000011110000000
  306.         dc.w    %0000110011000000
  307.         dc.w    %0000110011000000
  308.         dc.w    %0001100001100000
  309.         dc.w    %0001100001100000
  310.         dc.w    %0001111111100000
  311.         dc.w    %0011111111110000
  312.         dc.w    %0011000000110000
  313.         dc.w    %0011000000110000
  314.         dc.w    %0110000000011000
  315.         dc.w    %0110000000011000
  316.  
  317.         dc.b    9,9                ; "n"
  318.         dc.w    %0001100111000000
  319.         dc.w    %0001101111100000
  320.         dc.w    %0001110001100000
  321.         dc.w    %0001100001100000
  322.         dc.w    %0001100001100000
  323.         dc.w    %0001100001100000
  324.         dc.w    %0001100001100000
  325.         dc.w    %0001100001100000
  326.         dc.w    %0001100001100000
  327.         dc.w    %0001100001100000
  328.  
  329.         dc.b    9,5                ; "a"
  330.         dc.w    %0000011111000000
  331.         dc.w    %0000111011100000
  332.         dc.w    %0000110001100000
  333.         dc.w    %0000000011100000
  334.         dc.w    %0000011111100000
  335.         dc.w    %0000111001100000
  336.         dc.w    %0000110001100000
  337.         dc.w    %0000110001100000
  338.         dc.w    %0000111011100000
  339.         dc.w    %0000011101100000
  340.  
  341.         dc.b    13,9                ; "l"
  342.         dc.w    %0000001100000000
  343.         dc.w    %0000001100000000
  344.         dc.w    %0000001100000000
  345.         dc.w    %0000001100000000
  346.         dc.w    %0000001100000000
  347.         dc.w    %0000001100000000
  348.         dc.w    %0000001100000000
  349.         dc.w    %0000001100000000
  350.         dc.w    %0000001100000000
  351.         dc.w    %0000001100000000
  352.         dc.w    %0000001100000000
  353.         dc.w    %0000001100000000
  354.         dc.w    %0000001100000000
  355.         dc.w    %0000001100000000
  356.  
  357.         dc.b    9,9                ; "o"
  358.         dc.w    %0000011111000000
  359.         dc.w    %0000111111100000
  360.         dc.w    %0000110001100000
  361.         dc.w    %0001100000110000
  362.         dc.w    %0001100000110000
  363.         dc.w    %0001100000110000
  364.         dc.w    %0001100000110000
  365.         dc.w    %0000110001100000
  366.         dc.w    %0000111111100000
  367.         dc.w    %0000011111000000
  368.  
  369.         dc.b    13,0                ; "g"
  370.         dc.w    %0000011110110000
  371.         dc.w    %0000111111110000
  372.         dc.w    %0000110000110000
  373.         dc.w    %0001100000110000
  374.         dc.w    %0001100000110000
  375.         dc.w    %0001100000110000
  376.         dc.w    %0001100000110000
  377.         dc.w    %0000110001110000
  378.         dc.w    %0000111111110000
  379.         dc.w    %0000011110110000
  380.         dc.w    %0000000000110000
  381.         dc.w    %0000110001100000
  382.         dc.w    %0000111111100000
  383.         dc.w    %0000001110000000
  384.  
  385.         dc.b    -1,-1                ; end
  386.  
  387. JuliaData:    dc.l    $f800eb00
  388.         dc.w    $0018,$0100,$0ad0,$ec00
  389.         dc.l    $ef000010
  390.         dc.w    $0600,$0100,$f226,$fd56
  391.         dc.l    $0015ee00
  392.         dc.w    $fb40,$ede2,$f0b2,$001d
  393.         dc.l    $05c0ff00
  394.         dc.w    $ef12,$e812,$001d,$f320
  395.         dc.l    $fd21eeae
  396.         dc.w    $0225,$000d,$f420,$fd43
  397.         dc.l    $00000000
  398.  
  399. DosName:    dc.b    'dos.library',0
  400.  
  401. BootLen        equ    *-BootBlock
  402.  
  403.